<?php
/**
 * Widget utilisé pour l'intégration du CKEditor à votre projet.
 *
 * @author      Jacksay<studio@jacksay.com>
 * @package     jckCKEditorPlugin
 * @subpackage  widget
 */
class jckWidgetFormCKEditor extends sfWidgetFormTextarea {
  /**
   * Les différentes options disponibles : 
   * - ckeditor_conf : Le fichier de configuration du CKEditor personnalisés à 
   * importer. par défaut sera utilisé celui du plugin. Vous pouvez par exemple 
   * déclarer dans ce fichier les différentes toolbar que vous utiliserez dans 
   * le projet.
   * - ckeditor_options : Options classiques, en définissant cette option vous 
   * rendez inutile les options suivantes.
   * - toolbar(
   * 
   * @param unknown_type $options
   * @param unknown_type $attributes
   */
  
  
  protected $default_ckeditor_options = '{
      toolbar: {toolbar},
      format_tags: "{format_tags}",
      language: "{language}",
      uiColor: "{uiColor}",{scayt_opt}{filebrowserBrowseUrl}
      styleSet: {styleSet},
      on:{instanceReady:function( ev ){{instanceReady_evt}}}
  }';
  
  
  protected function configure($options = array(), $attributes = array()) 
  {
    parent::configure($options, $attributes);

    $this->addOption('ckeditor_conf', '/jckCKEditorPlugin/js/toolbar_jck.js');
    
    
    //browser_profil
    // ------------------------------------------------------------------- SCAYT
    $this->addOption('browser_profil', false);
    $this->addOption('filebrowserBrowseUrl', '');
    $this->addOption('scayt_opt', '');
    $this->addOption('scayt_enabled', false);
    $this->addOption('scayt_autoStartup', true);
    $this->addOption('scayt_sLang', sfContext::getInstance()->getUser()->getCulture());
    
    $this->addOption('uiColor', '#ddd');
    $this->addOption('format_tags', 'p;address;h2;h3;h4;h5;h6;pre');
    $this->addOption('language', sfContext::getInstance()->getUser()->getCulture());
    $this->addOption('styleSet', 'null');
    $this->addOption('nobreak_tag', array('p','pre','blockquote'));
    $this->addOption('toolbar', 'jck_toolbar_basic');
    $this->addOption('instanceReady_evt', '');
    
    $this->addOption('html_decode', false);
    
    /**
     * scayt_autoStartup: true,
      scayt_sLang: "'.sfContext::getInstance()->getUser()->getCulture().'",

     */
    $this->addOption('ckeditor_options', $this->default_ckeditor_options);

    $this->addOption('template.js', '
      <script type="text/javascript">
      CKEDITOR.replace("{textarea.id}",{ckeditor.options});
      </script>
    ');
  }

  public function  render($name, $value = null, $attributes = array(), $errors = array()) {
    if( $this->getOption('html_decode') ) {
        $value = htmlentities($value);
    }
    
    $html = parent::render($name, $value, $attributes, $errors);
    
    // Récupération des options
    $options = $this->getOption('ckeditor_options');
    
    // Si le pattern des options est celui par défaut, on effectue la 
    // substitution des paramètres.
    if( $options == $this->default_ckeditor_options )
    {
      // JckBrowser
      $filebrowserBrowseUrl = $this->getOption('filebrowserBrowseUrl');
      if( $this->getOption('browser_profil') ){
        $filebrowserBrowseUrl = 'filebrowserBrowseUrl: "'.  url_for('jckbrowser_browse').'?profil='.$this->getOption('browser_profil').'&type=Flash",'
                . 'filebrowserImageBrowseUrl: "'.  url_for('jckbrowser_browse').'?profil='.$this->getOption('browser_profil').'&type=Images",';
      }
      // --- Scayt
      if($this->getOption('scayt_enabled') && $this->getOption('scayt_opt') == '')
      {
        $scayt_conf = '
        scayt_autoStartup: '.($this->getOption('scayt_autoStartup')?'true':'false').',scayt_sLang:"'.$this->getOption('scayt_sLang').'",
        ';
      }
      
      else 
      {
        $scayt_conf = $this->getOption('scayt_opt');
      }
      
      // -- InstanceReady
      $instanceReady_evt = $this->getOption('instanceReady_evt');
      $tags = $this->getOption('nobreak_tag');
      foreach( $tags as $tag )
      {
        $instanceReady_evt .= 'this.dataProcessor.writer.setRules( "'.$tag.'",{indent:false,breakBeforeOpen:true,breakAfterOpen:false,breakBeforeClose:false,breakAfterClose:true});'; 
      }
      
      // --- Finalisation
      $template_opt = array(
        '{scayt_opt}'         => $scayt_conf,
        '{toolbar}'           => $this->getOption('toolbar'),
        '{format_tags}'       => $this->getOption('format_tags'),
        '{language}'          => $this->getOption('language'),
        '{uiColor}'           => $this->getOption('uiColor'),
        '{styleSet}'              => $this->getOption('styleSet'),
        '{filebrowserBrowseUrl}'  => $filebrowserBrowseUrl,
        '{instanceReady_evt}' => $instanceReady_evt
      );
      
      $options = strtr($options, $template_opt);
    }
    
    //
    $template_vars = array(
      '{textarea.id}'       =>  $this->generateId($name),
      '{ckeditor.options}'  =>  $options
    );

    return strtr($html.$this->getOption('template.js'), $template_vars);
  }

  public function  getJavaScripts() {
    $js = array();
    $js[] = sfConfig::get('app_jckbrowser_ckeditor_path');

    if( $this->getOption('ckeditor_conf') ){
      $js[] = $this->getOption('ckeditor_conf');
    }
    return $js;
  }

}
?>
